//正整数 n 代表生成括号的对数，请设计一个函数，用于能够生成所有可能的并且 有效的 括号组合。 
//
// 
//
// 示例 1： 
//
// 
//输入：n = 3
//输出：["((()))","(()())","(())()","()(())","()()()"]
// 
//
// 示例 2： 
//
// 
//输入：n = 1
//输出：["()"]
// 
//
// 
//
// 提示： 
//
// 
// 1 <= n <= 8 
// 
//
// 
//
// 
// 注意：本题与主站 22 题相同： https://leetcode-cn.com/problems/generate-parentheses/ 
//
// Related Topics 字符串 动态规划 回溯 👍 49 👎 0

package leetcode.editor.cn;

import java.util.ArrayList;
import java.util.List;

//leetcode submit region begin(Prohibit modification and deletion)
class SolutionOffer2_085 {
    List<String> result = new ArrayList<>();
    StringBuffer sb = new StringBuffer();
    public List<String> generateParenthesis(int n) {
        dfs(n, 0, 0, 0);
        return result;
    }

    public void dfs(int n, int pos, int lCount, int rCount){
        if(pos == 2*n){
            result.add(new String(sb));
            return;
        }
        if(lCount < n) {
            sb.append('(');
//            lCount++;
            dfs(n, pos+1, lCount+1, rCount);
//            lCount--;
            sb.deleteCharAt(sb.length() - 1);
        }
        if(rCount < lCount){
            sb.append(')');
//            rCount++;
            dfs(n, pos+1, lCount, rCount+1);
//            rCount--;
            sb.deleteCharAt(sb.length() - 1);
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)
